/*
 * @Description  : 用于存放项目以及作者的一些信息
 * @Version      : 0.1
 * @Company      : V-Think Development Team
 * @Author       : KiraVerSace@yeah.net
 * @Date         : 2022-03-25 17:33:31
 * @LastEditTime : 2024-09-03 16:02:19
 */
#ifndef __X_CODE_H__
#define __X_CODE_H__

#include <Arduino.h>

#define ULTIMATE
// #define SIMPLE

#define MCU_TYPE            "STM32L476RGT6"
#define PRODUCT_MODEL       "VT-R1010F"
#define	DEVELOPER			"KiraVerSace@yeah.net"


/* HWC=Hardware Code */
#define HWC103_DEFAULT_OTA_CRC      (0x336C9A6C)
#define HWC103_DEFAULT_OTA_URL      "http://ota.iot-api.com/firmware/sh-4/mpdexekq/9gog1hspi8bqqh0ymjycp8xnh112nunq.bin"    // Ultimate V5.0.6
#define HWC801_DEFAULT_OTA_CRC      (0x00000000)
#define HWC801_DEFAULT_OTA_URL      "http://ota.iot-api.com/firmware/bj-3/3tm6lxuw/f4au8yqerkmp48x15zmxuugxl5wsi8df.bin"    // SpecialEdition V1.4.3

#define BOOTLOADER_SIZE_KB          128                                              // BootLoader大小[KB]
#define USR_APP_ADDRESS             (uint32_t)(FLASH_BASE+BOOTLOADER_SIZE_KB*1024)
#define USR_APP_SIZE_KB             (uint32_t)(FLASH_SIZE/1024-BOOTLOADER_SIZE_KB)  // Application大小[KB]

#define OTA_PROTOCOL                "TCP"
#define OTA_SERVER_HOST             "ota.iot-api.com"
#define OTA_SERVER_PORT             80
#define OTA_HTTP_GET_SIZE_BYTE_PER  10240   // HTTP每次请求的数据包大小,如果修改了该数值切记也要修改FSM_HTTP_GET_RESPONSE中的接收超时时间
#define OTA_BUFFER_SIZE             (OTA_HTTP_GET_SIZE_BYTE_PER+4096)

enum OTAUpgradeFlag
{
    OTA_FLAG_CLEAR = 1,
    OTA_FLAG_FROM_DEFAULT,
    OTA_FLAG_FROM_APP,
};
/**
 * 软件版本
 * V0.0.1 [2022-11-25]  初始版本,SpecialEdition板子可以成功从默认地址更新固件,
 *                      以及从默认固件中模拟升级到最新固件
 * V0.0.2 [2022-11-25]  可以实现两个固件的互相跳转优化Flash的写入函数,加入读校验
 * V0.0.3 [2022-11-25]  初步稳定,可以根据宏定义来定义每次下载的字节数
 * V1.0.0 [2022-11-26]  增加setOTANotifyFlag用于通知APP更新程序了
 *                      在FSM中增加一些错误计数增强系统的容错
 * V1.0.1 [2022-11-29]  移除SIMMode的属性,选择2K作为每次稳定传输的大小
 * V1.0.2 [2022-12-01]  暂定每次传输4K个字节,同时增加屏幕显示的逻辑
 *                      但因超过单片机FLASH大小,暂未开放
 * V1.0.3 [2022-12-01]  彻底移除加屏幕显示的逻辑,APP中会导致显示不正确
 * V1.1.0 [2022-12-02]  增加看门狗特性,增加接收计数,可以提高OTA升级过程的容错能力
 * V1.1.1 [2022-12-03]  修复了HEAD的返回可能混在GET的返回中,导致检索\r\n的BUG
 * V1.1.2 [2022-12-03]  继续完善GET中接收固件可能遇到的问题
 * V1.1.3 [2022-12-04]  增加识别硬件版本从不同的地址下载固件的功能
 * V1.1.4 [2022-12-04]  增加如果OTA地址不存在,那么从默认地址下载固件的功能
 * V1.1.5 [2022-12-05]  更新HWC100-102,801的默认下载URL
 * V1.1.6 [2022-12-05]  修复直接跳转也会将Notify置位的BUG
 * V1.1.7 [2022-12-05]  更新HWC100-102的默认下载URL
 * V1.2.0 [2022-12-07]  增加APP地址下载失败从默认地址下载的逻辑
 *                      增加跳转失败会自动从默认地址下载固件的逻辑
 *                      更新HWC100-102的默认下载URL
 * V1.2.1 [2022-12-07]  增加跳转失败的逻辑
 * V1.2.2 [2022-12-07]  更新HWC100-102的默认下载URL
 * V1.2.3 [2022-12-07]  优化LTE的逻辑
 * V1.3.0 [2022-12-08]  将LTE的配置移到Configure中去,优化LTE的驱动
 * V1.3.1 [2022-12-08]  加长开机启动延时,提高系统稳定性
 * V1.3.2 [2022-12-08]  增加BootLoader时蜂鸣器交替蜂鸣
 * V1.3.3 [2022-12-09]  优化了部分逻辑
 * V1.4.0 [2022-12-09]  修复了FlashErase的BUG
                        默认地址修改为2.6.2
                        增加CRC32的相关代码,但是计算结果尚未一致
 * V1.5.0 [2022-12-09]  完善JumpToApplication的判断机制
                        更新HWC[100-103]的默认下载地址
 * V1.5.1 [2022-12-31]  增加开机打印常识跳转次数
 * V1.5.2 [2023-01-03]  更新HWC[801]的默认下载地址]
 * V1.5.3 [2023-01-04]  更新HWC[100-103]的默认下载地址
 *                      增加BootLoader的Ver版本写入
 * V1.5.4 [2023-01-04]  更新HWC[100-103]的默认下载地址
 * V1.5.5 [2023-01-04]  更新HWC[100-103][801]的默认下载地址
 * V1.5.6 [2023-01-06]  更新HWC[100-103]的默认下载地址
 * V1.5.7 [2023-02-03]  更新HWC[100-103]HWC[801]的默认下载地址
 *
 * V2.0.0 [2023-02-05]  确定主线BootLoader,调整其大小->128KB
 *                      主线启用升级时屏幕显示进度
 *                      主线不再支持RC版本的SE版本
 *                      主线启用新版本号
 * V2.0.1 [2023-02-22]  更新HWC[100-103]的默认下载地址,RG
 * V3.0.0 [2023-07-03]  更新HWC[100-103]的默认下载地址->OneNET2.0
 * V3.0.1 [2023-07-20]  修复OneNET2.0会返回HTTP请求的严重BUG
 *                      修复OTA时只有SocketA建立连接
 *                      更新HWC103的默认固件下载地址[5.0.6]
 *                      取消固件的CRC校验特性[有BUG未清楚]
 * V3.0.2 [2023-07-20]  修复固件不能被8整除时候,会剩下4个字节不被写进去的BUG
 *
 */
#define SOFTWARE_VERSION_MAJOR  3
#define SOFTWARE_VERSION_MINOR  0
#define SOFTWARE_VERSION_PATCH  2

#define SOFTWARE_VERSION        (SOFTWARE_VERSION_MAJOR * 10000 \
                                  + SOFTWARE_VERSION_MINOR * 100 \
                                  + SOFTWARE_VERSION_PATCH)

#endif
